package com.naiterui.common.repository.page;

import org.springframework.data.domain.Page;

/**
 * 分页操作涉及内容及分页信息的转换工具类
 * 用于JPA的Page对象
 *
 * @author zhouyanxin
 * @since 1.0.0
 */
@SuppressWarnings("unused")
public final class JpaPageConvertor {

    /**
     * 用于将分页查询返回的分页对象中的实体结果集转换为指定类型的VO对象集合
     * PageConvertor.entityConvert()
     *
     * @param page
     * @param targetClassType
     *
     * @return
     *
     * @Author zhouyanxin
     * @Date 2017年8月21日
     * @since 1.0.0
     */
    public static <S, T> Page<T> entityConvert(Page<S> page, Class<T> targetClassType) {
        return page.map(new SimplePageContentConvert<>(targetClassType));
    }

    /**
     * 用户将数据查询得到的分页对象Page转换为PageVO对象
     * 由于spring-data-jpa的分页是基于offset，而PageVO是基于语义化
     * 所以转换操作除基本的赋值外，主要是处理语义化描述
     * PageConvertor.pageConvert()
     *
     * @param page
     *
     * @return
     *
     * @Author zhouyanxin
     * @Date 2017年8月21日
     * @since 1.0.0
     */
    public static <T> PageVO<T> pageConvert(Page<T> page) {
        return PageVO.newBuilder().pageNo(page.getNumber() + 1).pageSize(page.getSize()).totalCount((int) page.getTotalElements()).result(page.getContent()).build();
    }

    /**
     * 将通过Repository进行query返回的Page<Entity>对象，转换成对应的PageVO<EntityVO>
     * PageConvertor.convert()
     *
     * @param page
     * @param targetClassType
     *
     * @return
     *
     * @Author zhouyanxin
     * @Date 2017年10月8日
     * @since 1.0.0
     */
    public static <S, T> PageVO<T> convert(Page<S> page, Class<T> targetClassType) {
        return pageConvert(entityConvert(page, targetClassType));
    }
}
